package de.fhwf.mixedreality.client;


public interface IPositionsStorage {

	/** Returns a polar vector pointing towards the ball in the field. */
	public abstract Vector ball();

	/** Returns a vector pointing towards the goal poles in the field. */
	public abstract Vector myGoalPole1();

	/** Returns a vector pointing towards the goal poles in the field. */
	public abstract Vector myGoalPole2();

	/** Returns a vector pointing towards the goal poles in the field. */
	public abstract Vector opGoalPole1();

	/** Returns a vector pointing towards the goal poles in the field. */
	public abstract Vector opGoalPole2();

	/** Returns a vector pointing towards the field corners. */
	public abstract Vector myCornerFlag1();

	/** Returns a vector pointing towards the field corners. */
	public abstract Vector myCornerFlag2();

	/** Returns a vector pointing towards the field corners. */
	public abstract Vector opCornerFlag1();

	/** Returns a vector pointing towards the field corners. */
	public abstract Vector opCornerFlag2();

	/**
	 * This function returns the polar vector that
	 * gives the estimate position of a given
	 * teammate player
	 */
	public abstract Vector teammate(int id);

	/**
	 * This function returns the orientation of a given
	 * teammate player
	 */
	public abstract double teammateOrientation(int id);

	/**
	 * This function returns the polar vector that
	 * gives the estimate position of a given
	 * opponent player
	 */
	public abstract Vector opponent(int id);

	/**
	 * This function returns the orientation of a given
	 * opponent player
	 */
	public abstract double opponentOrientation(int id);

	/**
	 * Returns the vector pointing to the self. This
	 * always length zero, angle zero, but is put
	 * here for using combined with other functions
	 * like pv_closest_teammate_to(pv_me()) or more
	 * phylosophical ones like pv_escape_from(pv_me())
	 */
	public abstract Vector me();

	/** returns a vector pointing to the closest player (no matter which team) */
	public abstract Vector closestPlayer();

	/**
	 * This function returns the id of the closest
	 * teammate to a certain position given as
	 * argument
	 */
	public abstract int closestTeammateTo(Vector v);

	/**
	 * This function returns the id of the closest
	 * teammate to a certain position given as
	 * argument
	 */
	public abstract int closestOfTeamTo(Vector v);

	/**
	 * This function returns the id of the closest
	 * opponent to a certain position given as
	 * argument
	 */
	public abstract int closestOpponentTo(Vector v);

	/**
	 * This function returns the id of the closest
	 * teammate to the given opponent
	 */
	public abstract int closestTeammateToOpponent(int id);

	/** This function returns the id of the closest teammate to the given teammate */
	public abstract int closestTeammateToTeammate(int id);

	/** This function returns the id of the closest opponent to the given teammate */
	public abstract int closestOpponentToTeammate(int id);

	/** This function returns the id of the closest teammate to the given teammate */
	public abstract int closestOpponentToOpponent(int id);

	/** This function returns the id of the closest teammate to the ball */
	public abstract int closestTeammateToBall();

	/** This function returns the id of the closest opponent to the ball */
	public abstract int closestOpponentToBall();

	public abstract Vector getVectorByID(int vectorID);

	public abstract void setVectorByName(String name, Vector vector);
	
	public abstract void setBallPos(Vector ballPos);
	public abstract void setOpponentPos(int id, Vector opponentPos, double orientation);
	public abstract void setTeammatePos(int id, Vector teammatePos, double orientation);
	public abstract void setMyCornerFlag1(Vector myCornerFlag1);
	public abstract void setMyCornerFlag2(Vector myCornerFlag2);
	public abstract void setMyGoalPole1(Vector myGoalPole1);
	public abstract void setMyGoalPole2(Vector myGoalPole2);
	public abstract void setOpCornerFlag1(Vector opCornerFlag1);
	public abstract void setOpCornerFlag2(Vector opCornerFlag2);
	public abstract void setOpGoalPole1(Vector opGoalPole1);
	public abstract void setOpGoalPole2(Vector opGoalPole2);

  public abstract String getWorldString(boolean isLost);
}